package eu.telecom_bretagne.CESI.service;

import java.util.HashSet;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;

import eu.telecom_bretagne.CESI.data.dao.DemandeDAO;
import eu.telecom_bretagne.CESI.data.dao.DocumentDAO;
import eu.telecom_bretagne.CESI.data.dao.ImprimeurDAO;
import eu.telecom_bretagne.CESI.data.dao.ValideurDAO;
import eu.telecom_bretagne.CESI.data.model.Demande;
import eu.telecom_bretagne.CESI.data.model.Demandeur;
import eu.telecom_bretagne.CESI.data.model.Valideur;
import eu.telecom_bretagne.CESI.data.model.Imprimeur;
import eu.telecom_bretagne.CESI.data.model.Document;

/**
 * Session Bean implementation class GestionDemande
 */
@Stateless
@LocalBean
public class GestionDemande implements IGestionDemande {

	@EJB
	DemandeDAO demandeDAO;

	@EJB
	GestionDemandeur Gdeamndeur;

	@EJB
	GestionValideur Gvalideur;

	@EJB
	GestionDocument Gdocument;

	@EJB
	ValideurDAO valideurDAO;

	@EJB
	ImprimeurDAO imprimeurDAO;

	@EJB
	DocumentDAO documentDAO;

	/**
	 * Default constructor.
	 */
	public GestionDemande() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * method creation de demande.
	 */
	@Override
	public Demande creerDemandeImpression(int copy, Boolean couleur,
			Boolean mode, int demandeur_id, int document_id) {

		// lire demandeur
		Demandeur demandeur = Gdeamndeur.lireDemandeur(demandeur_id);
		// lire valideur
		Valideur valideur = Gvalideur.lireValideur(demandeur);
		// lire document
		Document document = Gdocument.lireDocument(document_id);

		// création et configuration de la demande

		Demande demande = new Demande();

		demande.setDemandeur(demandeur);
		demande.setValideur(valideur);
		demande.setDocument(document);
		// caractéristiques de la demande
		demande.setCopy(copy);
		demande.setCouleur(couleur);
		demande.setMode(mode);

		demande.setEtat("en attente de validation");

		// ajout de la demande dans la bd
		demandeDAO.create(demande);

		return demande;
	}

	/**
	 * method valider impression
	 */

	@Override
	public void validerDemandeImpression(int demande_id) {

		// lire demande à l'etat "en attente de validation"
		Demande demande = demandeDAO.findById(demande_id);
		// changement de l'etat "en attente de validation" ou "demande validée "
		demande.setEtat("demande validée");

	}

	/**
	 * method realisation impression.
	 */
	@Override
	public void realiserImpression(int demande_id) {

		// lire demande à l'etat "demande validée "
		Demande demande = demandeDAO.findById(demande_id);

		// changement de l'etat "demande validée " en "impression réalisée"
		demande.setEtat("impression realisee");
	}

	/**
	 * method livraison impression.
	 */
	@Override
	public void livrerImpression(int demande_id) {

		// lire demande à l'etat "demande réalisée "
		Demande demande = demandeDAO.findById(demande_id);

		// changement etat "impression realisée" en "impression livrée"
		demande.setEtat("impression livree");
	}

	/**
	 * method refuser impression
	 */
	public void refuserDemandeImpression(int demande_id) {
		// TODO Auto-generated method stub
		Demande demande = demandeDAO.findById(demande_id);
		demande.setEtat("demande refusée");
	}

	// lire les demandes du valideur
	@Override
	public Set<Demande> lireDemandeAValider(Valideur valideur) {
		// TODO Auto-generated method stub
		Set<Demande> demandes = new HashSet<Demande>();
		for (Demande demande : demandeDAO.findAll()) {
			if (demande.getValideur().equals(valideur)
					&& (demande.getEtat().compareTo("en attente de validation") == 0))
				demandes.add(demande);
		}

		return demandes;
	}

	@Override
	public Set<Demande> lireDemandeARealiser(Imprimeur imprimeur) {
		// TODO Auto-generated method stub
		Set<Demande> demandes = new HashSet<Demande>();
		for (Demande demande : demandeDAO.findAll()) {
			if (demande.getEtat().compareTo("demande validée") == 0)
				demandes.add(demande);
		}

		return demandes;
	}

	@Override
	public Set<Demande> lireDemandeALivrer(Imprimeur Imprimeur) {
		Set<Demande> demandes = new HashSet<Demande>();
		for (Demande demande : demandeDAO.findAll()) {
			if (demande.getEtat().compareTo("impression realisee") == 0)
				demandes.add(demande);
		}

		return demandes;
	}

}
